package com.jf.car.dao.impl;


import com.jf.car.bean.Userinfo;
import com.jf.car.dao.UserinfoDao;
import com.jf.car.util.BaseDao;
import com.jf.car.util.MyUtils;
import com.jf.car.util.PageInfo;

import java.util.ArrayList;
import java.util.List;

public class UserinfoDaoImpl implements UserinfoDao {
    /*筛选*/
    @Override
    /*实现了根据用户提供的查询条件和分页信息，从数据库中查询符合条件的用户数据，并将结果封装成Userinfo对象列表返回*/
    /*这是一个公共方法，返回值类型为List<Userinfo>，意味着该方法会返回一个包含Userinfo对象的列表*/
    public List<Userinfo> getPage(PageInfo pageInfo, Userinfo userinfo) {
        /*初始化一个 SQL 查询语句，此语句从userinfo表（别名u）和role表（别名r）中查询数据，运用左连接（left join）将两个表关联起来，关联条件是userinfo表的role_id等于role表的id。*/
        /*where 1 = 1这个条件是为了方便后续动态添加查询条件。*/
        String sql = "select u.*,r.name from userinfo u left join department r on u.department_id = r.id where 1 = 1 ";

        /*构建一个List<Object>类型的objs列表，用于存储 SQL 语句中的参数。*/
        List<Object> objs = new ArrayList<>();

        /*依据userinfo对象的各个属性值是否为空，动态地向 SQL 语句中添加查询条件。
        若属性值不为空，就在 SQL 语句中添加对应的and条件，并把属性值添加到objs列表里。*/
        /*isStringNotEmpty判断内容是否为空，不为空则返回true*/
        if(MyUtils.isStringNotEmpty(userinfo.getUsername())){
            sql+="and u.username = ? ";
            objs.add(userinfo.getUsername());
        }

        /*假设 userinfo.getNickname() 返回的值是 "张三"，那么最终生成的 SQL 语句中这部分查询条件就相当于 and u.nickname like '%张三%'，这样就能查询出 nickname 字段包含 "张三" 的所有记录。*/
        if(MyUtils.isStringNotEmpty(userinfo.getNickname())){
            sql+="and u.nickname like concat('%',?,'%') ";
            objs.add(userinfo.getNickname());
        }

        if(MyUtils.isStringNotEmpty(userinfo.getPhone())){
            sql+="and u.phone = ? ";
            objs.add(userinfo.getPhone());
        }

        if(userinfo.getStatus() != null){
            sql+="and u.status = ? ";
            objs.add(userinfo.getStatus());
        }

        if(userinfo.getDepartmentId() != null){
            sql+="and u.department_id = ? ";
            objs.add(userinfo.getDepartmentId());
        }

        /*在 SQL 语句末尾添加排序和分页条件，按照userinfo表的id字段降序排序，并使用limit关键字进行分页。*/
        sql+="order by u.id desc limit ?,?";
        objs.add(pageInfo.getOffset());
        objs.add(pageInfo.getPageSize());

//        调用BaseDao类的baseQuery方法执行 SQL 查询，该方法接收三个参数：
//        Userinfo.class：表示查询结果要映射的实体类类型。
//        sql：完整的 SQL 查询语句。
//        objs：SQL 语句中的参数列表。
//        最后返回查询结果，即一个包含Userinfo对象的列表。
        return BaseDao.baseQuery(Userinfo.class,sql,objs);
    }

    /*解决查询后的总条数的bug*/
    @Override
    public int getCount(Userinfo userinfo) {
        String sql = "select count(u.id) from userinfo u left join department r on u.department_id = r.id where 1 = 1 ";
        List<Object> objs = new ArrayList<>();
        if(MyUtils.isStringNotEmpty(userinfo.getUsername())){
            sql+="and u.username = ? ";
            objs.add(userinfo.getUsername());
        }
        if(MyUtils.isStringNotEmpty(userinfo.getNickname())){
            sql+="and u.nickname like concat('%',?,'%') ";
            objs.add(userinfo.getNickname());
        }
        if(MyUtils.isStringNotEmpty(userinfo.getPhone())){
            sql+="and u.phone = ? ";
            objs.add(userinfo.getPhone());
        }
        if(userinfo.getStatus() != null){
            sql+="and u.status = ? ";
            objs.add(userinfo.getStatus());
        }
        if(userinfo.getDepartmentId() != null){
            sql+="and u.department_id = ? ";
            objs.add(userinfo.getDepartmentId());
        }
        return BaseDao.baseQueryCount(sql,objs);
    }

    /*查询id*/
    @Override
    public Userinfo getById(int id) {
        String sql = "select * from userinfo where id = ?";
        return BaseDao.baseQueryBean(Userinfo.class,sql,id);
    }

    /*添加数据*/
    @Override
    public int add(Userinfo userinfo) {
        String sql = "insert into userinfo values(null,?,?,?,?,?,?,?,?)";
        return BaseDao.baseUpdate(sql,userinfo.getUsername(),userinfo.getPassword(),userinfo.getNickname(),userinfo.getPhone(),userinfo.getRole(),userinfo.getDepartmentId(),userinfo.getStatus(),userinfo.getAvatar());
    }


    /*删除数据*/
    @Override
    public int delete(int id) {
        /*删除id*/
        String sql = "delete from userinfo where id = ?";
        return BaseDao.baseUpdate(sql,id);
    }

    /*根据username查询数据*/
    @Override
    public Userinfo getByUsername(String username) {
        /*查询用户名*/
        /*这里是为了登录和注册的时候判断数据库中是否有这个用户名*/
        String sql = "select * from userinfo where username = ?";
        return BaseDao.baseQueryBean(Userinfo.class,sql,username);
    }


    /*更新数据*/
    @Override
    public int updateSelect(Userinfo userinfo) {
        String sql = "update userinfo set ";
        List<Object> objs = new ArrayList<>();
        if (MyUtils.isStringNotEmpty(userinfo.getNickname())){
            sql += "nickname = ?, ";
            objs.add(userinfo.getNickname());
        }
        if (MyUtils.isStringNotEmpty(userinfo.getPhone())){
            sql += "phone = ?, ";
            objs.add(userinfo.getPhone());
        }
        if (userinfo.getRole()!=null){
            sql +="role = ?, ";
            objs.add(userinfo.getRole());
        }
        if (MyUtils.isStringNotEmpty(userinfo.getPassword())){
            sql += "password = ?, ";
            objs.add(userinfo.getPassword());
        }
        if (userinfo.getStatus() != null){
            sql += "status = ?, ";
            objs.add(userinfo.getStatus());
        }
        if (userinfo.getDepartmentId() != null){
            sql += "department_id = ?, ";
            objs.add(userinfo.getDepartmentId());
        }
        if (MyUtils.isStringNotEmpty(userinfo.getAvatar())){
            sql +="avatar = ?,";
            objs.add(userinfo.getAvatar());
        }
        /*获取最后一个逗号的下标*/
        int lastIndex =sql.lastIndexOf(",");
        /*截取最后一个逗号前的内容*/
        sql=sql.substring(0,lastIndex)+" ";

        sql+="where id = ? ";
        objs.add(userinfo.getId());
        return BaseDao.baseUpdate(sql,objs);
    }

    /*批量删除*/
    @Override
    public int batchDelete(int[] ids) {
        List<Object> objs = new ArrayList<>();
        StringBuilder sql = new StringBuilder("delete from userinfo where id in (");
        for (int id:ids){
            sql.append("?,");
            objs.add(id);
        }
        int lastIndex = sql.lastIndexOf(",");
        sql = new StringBuilder(sql.substring(0, lastIndex));
        sql.append(")");
        return BaseDao.baseBatch(sql.toString(),ids.length,objs);
    }

    /**/
    @Override
    public List<Userinfo> getUserinfoByDepartmentIds(int[] roleIds) {
        List<Object> objs = new ArrayList<>();
        StringBuilder sql = new StringBuilder("select * from userinfo where role_id in (");
        for (int roleId :roleIds){
            sql.append("?, ");
            objs.add(roleId);
        }
        sql=new StringBuilder(sql.substring(0,sql.lastIndexOf(",")));
        sql.append(")");
        return BaseDao.baseQuery(Userinfo.class,sql.toString(),objs);
    }
}
